home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AOL File Library: 2,801 to 2,900
/
aol-file-protocol-4400-2801-to-2900.zip
/
AOLDLs
/
C++ Files Library
/
Graphic Gems I, II & III (C_C++)
/
Graphics Gems C Code.sea
/
GemsII
/
Peano
/
main.c
next >
Wrap
C/C++ Source or Header
|
1992-06-16
|
3KB
|
145 lines
/* main.c */
/* copyright Ken Musgrave */
/* June 1986 */
/*
* creates an 8-bit, 2-D peano curve image file
* background is 0, curve segments range in value from 1 to 255
*
* NOTE: the peano curve can be n-dimensional,
* this is just an example of the use of the
* routines in peano.c
*/
#include <stdio.h>
#include <math.h>
#include "types.h"
char *image_file="im_file";
unsigned char fb[FB_SIZE + 1][FB_SIZE + 1];
FILE *outfile, *fopen();
vector coord, last_coord;
main(argc, argv)
int argc;
char *argv[];
{
int i, pos=0;
/* get command-line arg */
if (argc != 2) {
fprintf(stderr, "usage: %s precision\n", argv[0]);
exit(0);
}
dimensions = 2; /* the dimension is fixed in this example */
precision = atoi(argv[1]);
if (precision < 0 || precision > MAX_PRECISION - 1) {
fprintf(stderr, "%s: can't work with %d bits of precision!\n", argv[0], precision);
exit(-1);
}
if ((outfile = fopen(image_file, "w")) == NULL) {
fprintf(stderr, "Error: cannot open file %s\n", image_file);
exit(-1);
}
printf("%s: filling %d dimensions to %d bits of precision.\n",
argv[0], dimensions, precision);
/* begin the mysterious & incomprehensible algorithm... */
for (i=0; i<dimensions; i++) {
bitmask[i] = 1 << (dimensions - i - 1);
bytemask |= 1 << i;
last_coord[i] = 0;
}
/* run the mysterious & incomprehensible algorithm... */
recurse(coord, last_coord, (int) pow(2.0, (double) precision),
dimensions);
/* inform user that execution of algorithm is complete */
fprintf(stderr, "Spewing...");
for (i=FB_SIZE-1; i>=0; i--)
fwrite(fb[i], 1, FB_SIZE, outfile);
fprintf(stderr, " done.");
exit(0);
} /* main() */
/*
* recursive routine to call "peano()"
*/
recurse(coord, last_coord, iterations, level)
vector coord, last_coord;
int iterations, level;
{
int i, x, y, index;
static int n=0, scale, offset;
if (level > 0)
for (i=0; i<iterations; i++)
recurse(coord, last_coord, iterations, level - 1);
else {
/* get x,y coord of position n on peano curve */
peano(coord, n++);
offset = ((int) pow(2.0, (double) precision));
scale = FB_SIZE / ((int) pow(2.0, (double) precision));
offset = scale / 2;
/* draw line between adjacent coords */
draw_line(scale * coord[1] + offset,
FB_SIZE - scale * coord[0] - offset,
scale * last_coord[1] + offset,
FB_SIZE - scale * last_coord[0] - offset,
n);
/*
* x = scale*coord[1]+offset; y =
* FB_SIZE-scale*coord[0]-offset; index = n%256;
*/
for (i=0; i<precision; i++)
last_coord[i] = coord[i];
}
} /* recurse() */
/*
* draws horizontal and vertical lines into "fb" with color "index"
*/
draw_line(x1, y1, x2, y2, index)
unsigned x1, y1, x2, y2, index;
{
int tmp, i;
index = index % 256;
if (index == 0)
index = 1;
if (x1 != x2) { /* have horizontal line */
if (x1 > x2) {
tmp = x1;
x1 = x2;
x2 = tmp;
}
for (i=x1; i<=x2; i++)
fb[y1][i] = (unsigned char) index;
} else { /* vertical line */
if (y1 > y2) {
tmp = y1;
y1 = y2;
y2 = tmp;
}
for (i=y1; i<=y2; i++)
fb[i][x1] = (unsigned char) index;
}
} /* draw_line() */